package com.example.design.函数式编程.b闭包;

import lombok.extern.slf4j.Slf4j;

/**
 * 闭包: 函数对象和外界的变量给绑定到一起了，形成了一个整体，就是闭包。
 * 就像函数身上被了一个背包，背包里背了变量x。
 * 闭包的限制：
 * 1，闭包的接口应该是函数式接口。
 * 2，变量可以是局部变量，静态变量，成员变量。
 * 3，闭包使用的外部变量，都应该是final的或effective final(虽然没加final关键字，但变量本身没改变过)，因为要保证函数的不变性，如果外部变量变来变去，函数的逻辑就不确定了
 * 4，变量是对象的话，对象是不可以变，但是对象里的变量可以变
 * 闭包的作用：
 * 1，给函数提供除了参数以外的参数
 *
 */
@Slf4j
public class ClosureExample {
    @FunctionalInterface
    interface Lamdba {
        int op(int y);
    }

    static void highOrder(Lamdba lamdba) {
        log.info("结果：{}", lamdba.op(1));
    }

    public static void main(String[] args) {
        // 基本类型变量
        int x = 10;
        highOrder(y -> x + y);

        // 对象
        Student zhangsan = new Student(20);
        highOrder(y -> zhangsan.age + y);
        // zhangsan对象本身不能修改
//        zhangsan = new Student(12);
        zhangsan.age = 22;
        // 只做了外层对象的限制，对象里的成员变量可以变
        highOrder(y -> zhangsan.age + y);
    }


    static class Student {
        int age;
        public Student(int age) {
            this.age = age;
        }
    }
}